<!doctype html>
<html class="no-js" lang="">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>angular-oauth2-oidc</title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <link rel="icon" type="image/x-icon" href="./images/favicon.ico">
	   <link rel="stylesheet" href="./styles/style.css">
        <link rel="stylesheet" href="./styles/dark.css">
    </head>
    <body>
          <script>
               // Blocking script to avoid flickering dark mode
               // Dark mode toggle button
               var useDark = window.matchMedia('(prefers-color-scheme: dark)');
               var darkModeState = useDark.matches;
               var $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input');
               var $darkModeToggles = document.querySelectorAll('.dark-mode-switch');
               var darkModeStateLocal = localStorage.getItem('compodoc_darkmode-state');

               function checkToggle(check) {
                    for (var i = 0; i < $darkModeToggleSwitchers.length; i++) {
                         $darkModeToggleSwitchers[i].checked = check;
                    }
               }

               function toggleDarkMode(state) {
                    if (window.localStorage) {
                         localStorage.setItem('compodoc_darkmode-state', state);
                    }

                    checkToggle(state);

                    const hasClass = document.body.classList.contains('dark');

                    if (state) {
                         for (var i = 0; i < $darkModeToggles.length; i++) {
                              $darkModeToggles[i].classList.add('dark');
                         }
                         if (!hasClass) {
                              document.body.classList.add('dark');
                         }
                    } else {
                         for (var i = 0; i < $darkModeToggles.length; i++) {
                              $darkModeToggles[i].classList.remove('dark');
                         }
                         if (hasClass) {
                              document.body.classList.remove('dark');
                         }
                    }
               }

               useDark.addEventListener('change', function (evt) {
                    toggleDarkMode(evt.matches);
               });
               if (darkModeStateLocal) {
                    darkModeState = darkModeStateLocal === 'true';
               }
               toggleDarkMode(darkModeState);
          </script>

        <div class="navbar navbar-default navbar-fixed-top d-md-none p-0">
               <div class="d-flex">
                    <a href="./" class="navbar-brand">angular-oauth2-oidc</a>
                    <button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button>
               </div>
        </div>

        <div class="xs-menu menu" id="mobile-menu">
                <div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div>            <compodoc-menu></compodoc-menu>
        </div>

        <div class="container-fluid main">
           <div class="row main">
               <div class="d-none d-md-block menu">
                   <compodoc-menu mode="normal"></compodoc-menu>
               </div>
               <!-- START CONTENT -->
               <div class="content getting-started">
                   <div class="content-data">

<h1>angular-oauth2-oidc</h1>
<p>Support for OAuth 2 and OpenId Connect (OIDC) in Angular. Already prepared for the upcoming OAuth 2.1.</p>
<p><img src="https://raw.githubusercontent.com/manfredsteyer/angular-oauth2-oidc/master/oidc.png" alt="OIDC Certified Logo" class="img-responsive"></p>
<h2>Credits</h2>
<ul>
<li><a href="https://kjur.github.io/jsrsasign/">jsrsasign</a> for validating token signature and for hashing</li>
<li><a href="https://github.com/identityserver">Identity Server</a> for testing with an .NET/.NET Core Backend</li>
<li><a href="http://www.keycloak.org/">Keycloak (Redhat)</a> for testing with Java</li>
<li><a href="https://auth0.com/">Auth0</a></li>
</ul>
<h2>Resources</h2>
<ul>
<li>Sources and Sample: <a href="https://github.com/manfredsteyer/angular-oauth2-oidc">https://github.com/manfredsteyer/angular-oauth2-oidc</a></li>
<li>Source Code Documentation: <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs">https://manfredsteyer.github.io/angular-oauth2-oidc/docs</a></li>
<li>Community-provided sample implementation: <a href="https://github.com/jeroenheijmans/sample-angular-oauth2-oidc-with-auth-guards/">https://github.com/jeroenheijmans/sample-angular-oauth2-oidc-with-auth-guards/</a></li>
</ul>
<h2>Tested Environment</h2>
<p>Successfully tested with <strong>Angular 4.3 to Angular 16</strong> and its Router, PathLocationStrategy as well as HashLocationStrategy and CommonJS-Bundling via webpack.</p>
<p>On the server-side we&#39;ve used <strong>IdentityServer</strong> (.NET / .NET Core), Redhat&#39;s <strong>Keycloak</strong> (Java), and <strong>Auth0</strong> (Auth0 is officially supported since version 10 of this lib). For Auth0, please have a look into the respective documentation page here.</p>
<p>For using this library with <strong>Azure Active Directory</strong> (<strong>Azure AD</strong>), we recommend an additional look to this <a href="https://dev.to/yuriburger/azure-active-directory-b2c-with-pkce-for-your-angular-app-1dcg">blog post</a> and the example linked at the end of this blog post.</p>
<p>Also, the Okta community created some guidelines on how to use this lib with Okta. See the links at the end of this page for more information.</p>
<p><strong>Angular 20</strong>: Use 20.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 19</strong>: Use 19.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 18</strong>: Use 18.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 17</strong>: Use 17.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 16</strong>: Use 16.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 15</strong>: Use 15.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 14</strong>: Use 14.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 13</strong>: Use 13.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 12</strong>: Use 12.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 11</strong>: Use 10.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 10</strong>: Use 10.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 9</strong>: Use 9.x versions of this library (<strong>should also work with older Angular versions!</strong>).</p>
<p><strong>Angular 8</strong>: Use 8.x versions of this library.</p>
<p><strong>Angular 7</strong>: Use 7.x versions of this library.</p>
<p><strong>Angular 6</strong>: Use Version 4.x of this library. Version 4.x was tested with Angular 6. You can also try the newer version 5.x of this library which has a much smaller bundle size.</p>
<p><strong>Angular 5.x or 4.3</strong>: If you need support for Angular &lt; 6 (4.3 to 5.x) you can download the former version 3.1.4 (npm i angular-oauth2-oidc@^3 --save).</p>
<h2>Release Cycle</h2>
<ul>
<li>We plan one major release for each Angular version<ul>
<li>Will contain new features</li>
<li>Will contain bug fixes and PRs</li>
</ul>
</li>
<li>Critical bugfixes on demand</li>
</ul>
<h2>Contributions</h2>
<ul>
<li><p>Feel free to file pull requests</p>
</li>
<li><p>The issues contain some ideas for PRs and enhancements (see labels)</p>
</li>
<li><p>If you want to contribute to the docs, you can do so in the <code>docs-src</code> folder. Make sure you update <code>summary.json</code> as well. Then generate the docs with the following commands:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-sh">npm install -g &#64;compodoc/compodoc
npm run docs</code></pre></div></li>
</ul>
<h2>Features</h2>
<ul>
<li>Logging in via Code Flow + PKCE<ul>
<li>Hence, you are safe for the upcoming OAuth 2.1</li>
</ul>
</li>
<li>Logging in via Implicit Flow (where a user is redirected to Identity Provider)</li>
<li>&quot;Logging in&quot; via Password Flow (where a user enters their password into the client)</li>
<li>Token Refresh for all supported flows</li>
<li>Automatically refreshing a token when/some time before it expires</li>
<li>Querying Userinfo Endpoint</li>
<li>Querying Discovery Document to ease configuration</li>
<li>Validating claims of the id_token regarding the specs</li>
<li>Hook for further custom validations</li>
<li>Single-Sign-Out by redirecting to the auth-server&#39;s logout-endpoint</li>
<li>Tested with all modern browsers and IE</li>
<li>Token Revocation according to <a href="https://tools.ietf.org/html/rfc7009#section-2.2">RFC 7009</a></li>
</ul>
<h2>Sample-Auth-Server</h2>
<p>You can use the OIDC-Sample-Server used in our examples. It assumes, that your Web-App runs on <a href="http://localhost:4200">http://localhost:4200</a></p>
<p>Username/Password:</p>
<ul>
<li>max/geheim</li>
<li>bob/bob</li>
<li>alice/alice</li>
</ul>
<p><em>clientIds:</em></p>
<ul>
<li>spa (Code Flow + PKCE)</li>
<li>implicit (implicit flow)</li>
</ul>
<p><em>redirectUris:</em></p>
<ul>
<li>localhost:[4200-4202]</li>
<li>localhost:[4200-4202]/index.html</li>
<li>localhost:[4200-4202]/silent-refresh.html</li>
</ul>
<h2>Installing</h2>
<b>Example :</b><div><pre class="line-numbers"><code class="language-sh">npm i angular-oauth2-oidc --save</code></pre></div><h2>Option 1: Standalone APIs</h2>
<p>If you use Standalone Components introduced with Angular 14, you can use our standalone API (call to <code>provideOAuthClient</code>) in your <code>main.ts</code> to setup the <code>OAuthClient</code>:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-TypeScript">// main.ts -- Angular 15+ version
import { bootstrapApplication } from &#39;&#64;angular/platform-browser&#39;;

import { provideHttpClient } from &#39;&#64;angular/common/http&#39;;

import { AppComponent } from &#39;./app/app.component&#39;;
import { provideOAuthClient } from &#39;angular-oauth2-oidc&#39;;

bootstrapApplication(AppComponent, {
  providers: [
    provideHttpClient(),
    provideOAuthClient()
  ]
});</code></pre></div><p>As Angular 14 does have Standalone Components but no Standalone API for its <code>HttpClient</code>, you need to go with the traditional <code>HttpClientModule</code> in this version:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-TypeScript">// main.ts -- Angular 14 version
import { bootstrapApplication } from &#39;&#64;angular/platform-browser&#39;;

import { HttpClientModule } from &#39;&#64;angular/common/http&#39;;

import { AppComponent } from &#39;./app/app.component&#39;;
import { provideOAuthClient } from &#39;angular-oauth2-oidc&#39;;
import { importProvidersFrom } from &#39;&#64;angular/core&#39;;

bootstrapApplication(AppComponent, {
  providers: [
    importProvidersFrom(HttpClientModule),
    provideOAuthClient()
  ]
});</code></pre></div><p>The <code>provideOAuthClient</code> function takes the same parameters as the forRoot function of the OAuthModule that is still in place for the sake of compatibility with existing code bases.</p>
<h2>Option 2: Using NgModules</h2>
<b>Example :</b><div><pre class="line-numbers"><code class="language-TypeScript">import { HttpClientModule } from &#39;&#64;angular/common/http&#39;;
import { OAuthModule } from &#39;angular-oauth2-oidc&#39;;
// etc.

&#64;NgModule({
  imports: [
    // etc.
    HttpClientModule,
    OAuthModule.forRoot()
  ],
  declarations: [
    AppComponent,
    HomeComponent,
    // etc.
  ],
  bootstrap: [
    AppComponent
  ]
})
export class AppModule {
}</code></pre></div><h1>Logging in</h1>
<p>Since Version 8, this library supports code flow and <a href="https://tools.ietf.org/html/rfc7636">PKCE</a> to align with the current draft of the <a href="https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13">OAuth 2.0 Security Best Current Practice</a> document. This is also the foundation of the upcoming OAuth 2.1.</p>
<p>To configure your solution for code flow + PKCE you have to set the <code>responseType</code> to <code>code</code>:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-TypeScript">  import { AuthConfig } from &#39;angular-oauth2-oidc&#39;;

  export const authCodeFlowConfig: AuthConfig = {
    // Url of the Identity Provider
    issuer: &#39;https://idsvr4.azurewebsites.net&#39;,

    // URL of the SPA to redirect the user to after login
    redirectUri: window.location.origin + &#39;/index.html&#39;,

    // The SPA&#39;s id. The SPA is registerd with this id at the auth-server
    // clientId: &#39;server.code&#39;,
    clientId: &#39;spa&#39;,

    // Just needed if your auth server demands a secret. In general, this
    // is a sign that the auth server is not configured with SPAs in mind
    // and it might not enforce further best practices vital for security
    // such applications.
    // dummyClientSecret: &#39;secret&#39;,

    responseType: &#39;code&#39;,

    // set the scope for the permissions the client should request
    // The first four are defined by OIDC.
    // Important: Request offline_access to get a refresh token
    // The api scope is a usecase specific one
    scope: &#39;openid profile email offline_access api&#39;,

    showDebugInformation: true,
  };</code></pre></div><p>After this, you can initialize the code flow using:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-TypeScript">this.oauthService.initCodeFlow();</code></pre></div><p>There is also a convenience method <code>initLoginFlow</code> which initializes either the code flow or the implicit flow depending on your configuration.</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-TypeScript">this.oauthService.initLoginFlow();</code></pre></div><p>Also -- as shown in the readme -- you have to execute the following code when bootstrapping to make the library to fetch the token:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-TypeScript">this.oauthService.configure(authCodeFlowConfig);
this.oauthService.loadDiscoveryDocumentAndTryLogin();</code></pre></div><h3>Logging out</h3>
<p>The logOut method clears the used token store (by default <code>sessionStorage</code>) and forwards the user to the auth servers logout endpoint if one was configured (manually or via the discovery document).</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-typescript">this.oauthService.logOut();</code></pre></div><p>If you want to revoke the existing access token and the existing refresh token before logging out, use the following method:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-typescript">this.oauthService.revokeTokenAndLogout();</code></pre></div><h3>Skipping the Login Form</h3>
<p>If you don&#39;t want to display a login form that tells the user that they are redirected to the identity server, you can use the convenience function <code>this.oauthService.loadDiscoveryDocumentAndLogin();</code> instead of <code>this.oauthService.loadDiscoveryDocumentAndTryLogin();</code> when setting up the library.</p>
<p>This directly redirects the user to the identity server if there are no valid tokens. Ensure you have your <code>issuer</code> set to your discovery document endpoint!</p>
<h3>Calling a Web API with an Access Token</h3>
<p>You can automate this task by switching <code>sendAccessToken</code> on and by setting <code>allowedUrls</code> to an array with prefixes for the respective URLs. Use lower case for the prefixes.</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-TypeScript">OAuthModule.forRoot({
    resourceServer: {
        allowedUrls: [&#39;http://www.angular.at/api&#39;],
        sendAccessToken: true
    }
})</code></pre></div><p>If you need more versatility, you can look in the <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/working-with-httpinterceptors.html">documentation</a> how to setup a custom interceptor.</p>
<h2>Token Refresh</h2>
<p>See docs: <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/refreshing-a-token.html">https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/refreshing-a-token.html</a></p>
<h2>Routing</h2>
<p>If you use the <code>PathLocationStrategy</code> (which is on by default) and have a general catch-all-route (<code>path: &#39;**&#39;</code>) you should be fine. Otherwise look up the section <code>Routing with the HashStrategy</code> in the <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/">documentation</a>.</p>
<h2>Implicit Flow</h2>
<p>Nowadays, using code flow + PKCE -- as shown above -- is the recommended OAuth 2/OIDC flow for SPAs. To use the older implicit flow, lookup this docs: <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/using-implicit-flow.html">https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/using-implicit-flow.html</a></p>
<h2>More Documentation (!)</h2>
<p>See the <a href="https://manfredsteyer.github.io/angular-oauth2-oidc/docs/">documentation</a> for more information about this library.</p>
<h2>Breaking Change in Version 9</h2>
<p>With regards to tree shaking, beginning with version 9, the <code>JwksValidationHandler</code> has been moved to a library of its own. If you need it for implementing <strong>implicit flow</strong>, please install it using npm:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-none">npm i angular-oauth2-oidc-jwks --save</code></pre></div><p>After that, you can import it into your application by using this:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-typescript">import { JwksValidationHandler } from &#39;angular-oauth2-oidc-jwks&#39;;</code></pre></div><p>instead of that:</p>
<b>Example :</b><div><pre class="line-numbers"><code class="language-typescript">import { JwksValidationHandler } from &#39;angular-oauth2-oidc&#39;;</code></pre></div><p>Please note, that this dependency is not needed for the <strong>code flow</strong>, which is nowadays the <strong>recommended</strong> flow for single page applications. This also results in smaller bundle sizes.</p>
<h3>Breaking change in 9.1.0</h3>
<p>The use of <code>encodeURIComponent</code> on the argument passed to <code>initImplicitFlow</code> and its Code Flow counterparts was mandatory before this version.</p>
<p>Since that was considered a <em>bug</em>, the need to do so was removed.
Now the reverse is true <strong>if you&#39;re upgrading from before 9.0.0</strong>: you need to remove any call to encode URI components in your own application, as the library will now do it for you.</p>
<h2>Tutorials</h2>
<ul>
<li><a href="https://www.softwarearchitekt.at/post/2016/07/03/authentication-in-angular-2-with-oauth2-oidc-and-guards-for-the-newest-new-router-english-version.aspx">Tutorial with Demo Servers available online</a></li>
<li><a href="https://developer.okta.com/blog/2017/04/17/angular-authentication-with-oidc">Angular Authentication with OpenID Connect and Okta in 20 Minutes</a></li>
<li><a href="https://developer.okta.com/blog/2017/06/13/add-authentication-angular-pwa">Add Authentication to Your Angular PWA</a></li>
<li><a href="https://developer.okta.com/blog/2017/08/22/build-an-ionic-app-with-user-authentication">Build an Ionic App with User Authentication</a></li>
<li><a href="https://www.softwarearchitekt.at">On-Site Workshops</a></li>
<li><a href="https://github.com/jeroenheijmans/sample-auth0-angular-oauth2-oidc">Angular 6 with Auth0 using this library</a></li>
</ul>
<h2>Thanks to all Contributors</h2>
<p><a href="https://github.com/alexandis"><img alt="alexandis" src="https://avatars.githubusercontent.com/u/6149843?v=4&s=117" width="117"></a><a href="https://github.com/anbiniyar"><img alt="anbiniyar" src="https://avatars.githubusercontent.com/u/407653?v=4&s=117" width="117"></a><a href="https://github.com/anoordende"><img alt="anoordende" src="https://avatars.githubusercontent.com/u/11973801?v=4&s=117" width="117"></a><a href="https://github.com/ArsProgramma"><img alt="ArsProgramma" src="https://avatars.githubusercontent.com/u/4572729?v=4&s=117" width="117"></a><a href="https://github.com/nihanth007"><img alt="nihanth007" src="https://avatars.githubusercontent.com/u/14851784?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/bobvandevijver"><img alt="bobvandevijver" src="https://avatars.githubusercontent.com/u/1835343?v=4&s=117" width="117"></a><a href="https://github.com/BobCui20"><img alt="BobCui20" src="https://avatars.githubusercontent.com/u/59807069?v=4&s=117" width="117"></a><a href="https://github.com/Bottswana"><img alt="Bottswana" src="https://avatars.githubusercontent.com/u/6907460?v=4&s=117" width="117"></a><a href="https://github.com/ErazerBrecht"><img alt="ErazerBrecht" src="https://avatars.githubusercontent.com/u/6287467?v=4&s=117" width="117"></a><a href="https://github.com/Chris3773"><img alt="Chris3773" src="https://avatars.githubusercontent.com/u/22506071?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/ChristianMurphy"><img alt="ChristianMurphy" src="https://avatars.githubusercontent.com/u/3107513?v=4&s=117" width="117"></a><a href="https://github.com/d-moos"><img alt="d-moos" src="https://avatars.githubusercontent.com/u/14070689?v=4&s=117" width="117"></a><a href="https://github.com/enterprisebug"><img alt="enterprisebug" src="https://avatars.githubusercontent.com/u/1539741?v=4&s=117" width="117"></a><a href="https://github.com/craniodev"><img alt="craniodev" src="https://avatars.githubusercontent.com/u/8593824?v=4&s=117" width="117"></a><a href="https://github.com/FabianGosebrink"><img alt="FabianGosebrink" src="https://avatars.githubusercontent.com/u/11268349?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/FabienDehopre"><img alt="FabienDehopre" src="https://avatars.githubusercontent.com/u/97023?v=4&s=117" width="117"></a><a href="https://github.com/FRosner"><img alt="FRosner" src="https://avatars.githubusercontent.com/u/3427394?v=4&s=117" width="117"></a><a href="https://github.com/MisterJames"><img alt="MisterJames" src="https://avatars.githubusercontent.com/u/1197383?v=4&s=117" width="117"></a><a href="https://github.com/JessePreiner"><img alt="JessePreiner" src="https://avatars.githubusercontent.com/u/3847360?v=4&s=117" width="117"></a><a href="https://github.com/jesusbotella"><img alt="jesusbotella" src="https://avatars.githubusercontent.com/u/4319728?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/Jojofoulk"><img alt="Jojofoulk" src="https://avatars.githubusercontent.com/u/44689065?v=4&s=117" width="117"></a><a href="https://github.com/kristofdegrave"><img alt="kristofdegrave" src="https://avatars.githubusercontent.com/u/1322395?v=4&s=117" width="117"></a><a href="https://github.com/saxicek"><img alt="saxicek" src="https://avatars.githubusercontent.com/u/1708442?v=4&s=117" width="117"></a><a href="https://github.com/lukasmatta"><img alt="lukasmatta" src="https://avatars.githubusercontent.com/u/4323927?v=4&s=117" width="117"></a><a href="https://github.com/Maximaximum"><img alt="Maximaximum" src="https://avatars.githubusercontent.com/u/5593500?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/mpbalmeida"><img alt="mpbalmeida" src="https://avatars.githubusercontent.com/u/516102?v=4&s=117" width="117"></a><a href="https://github.com/mhyfritz"><img alt="mhyfritz" src="https://avatars.githubusercontent.com/u/718983?v=4&s=117" width="117"></a><a href="https://github.com/mdaehnert"><img alt="mdaehnert" src="https://avatars.githubusercontent.com/u/1017301?v=4&s=117" width="117"></a><a href="https://github.com/mcserra"><img alt="mcserra" src="https://avatars.githubusercontent.com/u/16702410?v=4&s=117" width="117"></a><a href="https://github.com/nhumblot"><img alt="nhumblot" src="https://avatars.githubusercontent.com/u/15015617?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/l1b3r"><img alt="l1b3r" src="https://avatars.githubusercontent.com/u/6207227?v=4&s=117" width="117"></a><a href="https://github.com/oleersoy"><img alt="oleersoy" src="https://avatars.githubusercontent.com/u/1163873?v=4&s=117" width="117"></a><a href="https://github.com/OskarsPakers"><img alt="OskarsPakers" src="https://avatars.githubusercontent.com/u/3343347?v=4&s=117" width="117"></a><a href="https://github.com/hellerbarde"><img alt="hellerbarde" src="https://avatars.githubusercontent.com/u/37417?v=4&s=117" width="117"></a><a href="https://github.com/paweldyminski"><img alt="paweldyminski" src="https://avatars.githubusercontent.com/u/33632375?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/bechhansen"><img alt="bechhansen" src="https://avatars.githubusercontent.com/u/426810?v=4&s=117" width="117"></a><a href="https://github.com/peterneave"><img alt="peterneave" src="https://avatars.githubusercontent.com/u/7982708?v=4&s=117" width="117"></a><a href="https://github.com/pmccloghrylaing"><img alt="pmccloghrylaing" src="https://avatars.githubusercontent.com/u/2329335?v=4&s=117" width="117"></a><a href="https://github.com/akehir"><img alt="akehir" src="https://avatars.githubusercontent.com/u/1078202?v=4&s=117" width="117"></a><a href="https://github.com/RubenVermeulen"><img alt="RubenVermeulen" src="https://avatars.githubusercontent.com/u/10133445?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/ryanmwright"><img alt="ryanmwright" src="https://avatars.githubusercontent.com/u/5000122?v=4&s=117" width="117"></a><a href="https://github.com/scttcper"><img alt="scttcper" src="https://avatars.githubusercontent.com/u/1400464?v=4&s=117" width="117"></a><a href="https://github.com/abshoff"><img alt="abshoff" src="https://avatars.githubusercontent.com/u/2471284?v=4&s=117" width="117"></a><a href="https://github.com/SpazzMarticus"><img alt="SpazzMarticus" src="https://avatars.githubusercontent.com/u/5716457?v=4&s=117" width="117"></a><a href="https://github.com/srenatus"><img alt="srenatus" src="https://avatars.githubusercontent.com/u/870638?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/sven-codeculture"><img alt="sven-codeculture" src="https://avatars.githubusercontent.com/u/3930643?v=4&s=117" width="117"></a><a href="https://github.com/Rocket18"><img alt="Rocket18" src="https://avatars.githubusercontent.com/u/11396142?v=4&s=117" width="117"></a><a href="https://github.com/Ceteareth"><img alt="Ceteareth" src="https://avatars.githubusercontent.com/u/1556143?v=4&s=117" width="117"></a><a href="https://github.com/vadjs"><img alt="vadjs" src="https://avatars.githubusercontent.com/u/10026333?v=4&s=117" width="117"></a><a href="https://github.com/Varada-Schneider"><img alt="Varada-Schneider" src="https://avatars.githubusercontent.com/u/62388762?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/Gimly"><img alt="Gimly" src="https://avatars.githubusercontent.com/u/168669?v=4&s=117" width="117"></a><a href="https://github.com/akkaradej"><img alt="akkaradej" src="https://avatars.githubusercontent.com/u/2855965?v=4&s=117" width="117"></a><a href="https://github.com/coyoteecd"><img alt="coyoteecd" src="https://avatars.githubusercontent.com/u/47973420?v=4&s=117" width="117"></a><a href="https://github.com/darbio"><img alt="darbio" src="https://avatars.githubusercontent.com/u/517620?v=4&s=117" width="117"></a><a href="https://github.com/filipvh"><img alt="filipvh" src="https://avatars.githubusercontent.com/u/6095002?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/kyubisation"><img alt="kyubisation" src="https://avatars.githubusercontent.com/u/594745?v=4&s=117" width="117"></a><a href="https://github.com/luciimon"><img alt="luciimon" src="https://avatars.githubusercontent.com/u/9714755?v=4&s=117" width="117"></a><a href="https://github.com/mike-rivera"><img alt="mike-rivera" src="https://avatars.githubusercontent.com/u/57490323?v=4&s=117" width="117"></a><a href="https://github.com/drobert-bfm"><img alt="drobert-bfm" src="https://avatars.githubusercontent.com/u/28102639?v=4&s=117" width="117"></a><a href="https://github.com/roblabat"><img alt="roblabat" src="https://avatars.githubusercontent.com/u/9885738?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/wdunn001"><img alt="wdunn001" src="https://avatars.githubusercontent.com/u/4011100?v=4&s=117" width="117"></a><a href="https://github.com/adrianbenjuya"><img alt="adrianbenjuya" src="https://avatars.githubusercontent.com/u/17908930?v=4&s=117" width="117"></a><a href="https://github.com/Andreas-Hjortland"><img alt="Andreas-Hjortland" src="https://avatars.githubusercontent.com/u/2162904?v=4&s=117" width="117"></a><a href="https://github.com/adematte"><img alt="adematte" src="https://avatars.githubusercontent.com/u/5064637?v=4&s=117" width="117"></a><a href="https://github.com/cgatian"><img alt="cgatian" src="https://avatars.githubusercontent.com/u/1752170?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/dirkbolte"><img alt="dirkbolte" src="https://avatars.githubusercontent.com/u/1572945?v=4&s=117" width="117"></a><a href="https://github.com/enricodeleo"><img alt="enricodeleo" src="https://avatars.githubusercontent.com/u/3534555?v=4&s=117" width="117"></a><a href="https://github.com/Gregordy"><img alt="Gregordy" src="https://avatars.githubusercontent.com/u/10693717?v=4&s=117" width="117"></a><a href="https://github.com/jeroenhinfi"><img alt="jeroenhinfi" src="https://avatars.githubusercontent.com/u/38323074?v=4&s=117" width="117"></a><a href="https://github.com/linjie997"><img alt="linjie997" src="https://avatars.githubusercontent.com/u/23615368?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/jfyne"><img alt="jfyne" src="https://avatars.githubusercontent.com/u/400281?v=4&s=117" width="117"></a><a href="https://github.com/kevincathcart-cas"><img alt="kevincathcart-cas" src="https://avatars.githubusercontent.com/u/72209838?v=4&s=117" width="117"></a><a href="https://github.com/martin1cerny"><img alt="martin1cerny" src="https://avatars.githubusercontent.com/u/773078?v=4&s=117" width="117"></a><a href="https://github.com/marvinosswald"><img alt="marvinosswald" src="https://avatars.githubusercontent.com/u/1621844?v=4&s=117" width="117"></a><a href="https://github.com/nick1699"><img alt="nick1699" src="https://avatars.githubusercontent.com/u/50705000?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/paulyoder"><img alt="paulyoder" src="https://avatars.githubusercontent.com/u/224111?v=4&s=117" width="117"></a><a href="https://github.com/reda-alaoui"><img alt="reda-alaoui" src="https://avatars.githubusercontent.com/u/2890843?v=4&s=117" width="117"></a><a href="https://github.com/remiburtin"><img alt="remiburtin" src="https://avatars.githubusercontent.com/u/4236675?v=4&s=117" width="117"></a><a href="https://github.com/gingters"><img alt="gingters" src="https://avatars.githubusercontent.com/u/755148?v=4&s=117" width="117"></a><a href="https://github.com/kranich"><img alt="kranich" src="https://avatars.githubusercontent.com/u/7249754?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/StefanoChiodino"><img alt="StefanoChiodino" src="https://avatars.githubusercontent.com/u/1428893?v=4&s=117" width="117"></a><a href="https://github.com/tpeter1985"><img alt="tpeter1985" src="https://avatars.githubusercontent.com/u/16336536?v=4&s=117" width="117"></a><a href="https://github.com/dennisameling"><img alt="dennisameling" src="https://avatars.githubusercontent.com/u/17739158?v=4&s=117" width="117"></a><a href="https://github.com/apps/dependabot"><img alt="dependabot[bot]" src="https://avatars.githubusercontent.com/in/29110?v=4&s=117" width="117"></a><a href="https://github.com/jdgeier"><img alt="jdgeier" src="https://avatars.githubusercontent.com/u/949299?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/mraible"><img alt="mraible" src="https://avatars.githubusercontent.com/u/17892?v=4&s=117" width="117"></a><a href="https://github.com/ajpierson"><img alt="ajpierson" src="https://avatars.githubusercontent.com/u/56389?v=4&s=117" width="117"></a><a href="https://github.com/artnim"><img alt="artnim" src="https://avatars.githubusercontent.com/u/414375?v=4&s=117" width="117"></a><a href="https://github.com/fmalcher"><img alt="fmalcher" src="https://avatars.githubusercontent.com/u/1683147?v=4&s=117" width="117"></a><a href="https://github.com/Flofie"><img alt="Flofie" src="https://avatars.githubusercontent.com/u/12624982?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/mabdelaal86"><img alt="mabdelaal86" src="https://avatars.githubusercontent.com/u/11019219?v=4&s=117" width="117"></a><a href="https://github.com/nhance"><img alt="nhance" src="https://avatars.githubusercontent.com/u/602226?v=4&s=117" width="117"></a><a href="https://github.com/Razzeee"><img alt="Razzeee" src="https://avatars.githubusercontent.com/u/5943908?v=4&s=117" width="117"></a><a href="https://github.com/maxisam"><img alt="maxisam" src="https://avatars.githubusercontent.com/u/456807?v=4&s=117" width="117"></a><a href="https://github.com/ismcagdas"><img alt="ismcagdas" src="https://avatars.githubusercontent.com/u/4133525?v=4&s=117" width="117"></a></p>
<p><a href="https://github.com/Toxicable"><img alt="Toxicable" src="https://avatars.githubusercontent.com/u/13490925?v=4&s=117" width="117"></a><a href="https://github.com/ManuelRauber"><img alt="ManuelRauber" src="https://avatars.githubusercontent.com/u/740791?v=4&s=117" width="117"></a><a href="https://github.com/vdveer"><img alt="vdveer" src="https://avatars.githubusercontent.com/u/1217814?v=4&s=117" width="117"></a><a href="https://github.com/jeroenheijmans"><img alt="jeroenheijmans" src="https://avatars.githubusercontent.com/u/1590536?v=4&s=117" width="117"></a><a href="https://github.com/manfredsteyer"><img alt="manfredsteyer" src="https://avatars.githubusercontent.com/u/1573728?v=4&s=117" width="117"></a></p>





















                   </div><div class="search-results">
    <div class="has-results">
        <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
        <ul class="search-results-list"></ul>
    </div>
    <div class="no-results">
        <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
    </div>
</div>
</div>
               <!-- END CONTENT -->
           </div>
       </div>

          <label class="dark-mode-switch">
               <input type="checkbox">
               <span class="slider">
                    <svg class="slider-icon" viewBox="0 0 24 24" fill="none" height="20" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" width="20" xmlns="http://www.w3.org/2000/svg">
                    <path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"></path>
                    </svg>
               </span>
          </label>

       <script>
            var COMPODOC_CURRENT_PAGE_DEPTH = 0;
            var COMPODOC_CURRENT_PAGE_CONTEXT = 'getting-started';
            var COMPODOC_CURRENT_PAGE_URL = 'index.html';
            var MAX_SEARCH_RESULTS = 15;
       </script>

       <script>
               $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input');
               checkToggle(darkModeState);
               if ($darkModeToggleSwitchers.length > 0) {
                    for (var i = 0; i < $darkModeToggleSwitchers.length; i++) {
                         $darkModeToggleSwitchers[i].addEventListener('change', function (event) {
                              darkModeState = !darkModeState;
                              toggleDarkMode(darkModeState);
                         });
                    }
               }
          </script>

       <script src="./js/libs/custom-elements.min.js"></script>
       <script src="./js/libs/lit-html.js"></script>

       <script src="./js/menu-wc.js" defer></script>
       <script nomodule src="./js/menu-wc_es5.js" defer></script>

       <script src="./js/libs/bootstrap-native.js"></script>

       <script src="./js/libs/es6-shim.min.js"></script>
       <script src="./js/libs/EventDispatcher.js"></script>
       <script src="./js/libs/promise.min.js"></script>
       <script src="./js/libs/zepto.min.js"></script>

       <script src="./js/compodoc.js"></script>

       <script src="./js/tabs.js"></script>
       <script src="./js/menu.js"></script>
       <script src="./js/libs/clipboard.min.js"></script>
       <script src="./js/libs/prism.js"></script>
       <script src="./js/sourceCode.js"></script>
          <script src="./js/search/search.js"></script>
          <script src="./js/search/lunr.min.js"></script>
          <script src="./js/search/search-lunr.js"></script>
          <script src="./js/search/search_index.js"></script>
       <script src="./js/lazy-load-graphs.js"></script>


    </body>
</html>
